<!-- 这是一个Vue组件的完整代码示例，用于生成和显示一个验证码，用户可以通过点击验证码来刷新它。验证码的每个字符都有随机的颜色、大小、间距和旋转角度，这增加了验证码的复杂度并减少自动识别的可能性。 -->
<template>
  <!-- 验证码容器，点击可以刷新验证码 -->
  <div
      class="ValidCode disabled-select"
      :style="`width:${width}; height:${height}`" <!-- 动态绑定样式，控制验证码的尺寸 -->
      @click="refreshCode" <!-- 绑定点击事件，用于刷新验证码 -->
  >
    <!-- 循环显示每个验证码字符 -->
    <span
        v-for="(item, index) in codeList" <!-- 循环codeList数组 -->
        :key="index" <!-- 提供唯一的key -->
        :style="getStyle(item)" <!-- 动态绑定样式，设置字符的显示风格 -->
    >{{ item.code }}</span> <!-- 显示字符 -->
  </div>
</template>


<script>
export default {
  name: 'ValidCode',
  model: {
    prop: 'value', // 使用v-model时绑定的属性
    event: 'input' // 使用v-model时触发的事件
  },
  props: {
    width: {
      type: String,
      default: '100px'
    },
    height: {
      type: String,
      default: '40px'
    },
    length: {
      type: Number,
      default: 4 // 验证码长度，默认为4
    },
    refresh: {
      type: Number // 外部传入的刷新触发器
    }
  },
  data () {
    return {
      codeList: [] // 存储验证码的每个字符及其样式
    }
  },
  watch: {
    refresh () {
      this.createdCode() // 监听refresh变化，重新生成验证码
    }
  },
  mounted () {
    this.createdCode() // 组件挂载后生成验证码
  },
  methods: {
    refreshCode () {
      this.createdCode() // 刷新验证码
    },
    createdCode () {
      const len = this.length
      const codeList = []
      const chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz0123456789'
      const charsLen = chars.length
      // 生成验证码
      for (let i = 0; i < len; i++) {
        const rgb = [Math.round(Math.random() * 220), Math.round(Math.random() * 240), Math.round(Math.random() * 200)]
        codeList.push({
          code: chars.charAt(Math.floor(Math.random() * charsLen)),
          color: `rgb(${rgb})`,
          fontSize: `${10 + (+[Math.floor(Math.random() * 10)] + 6)}px`,
          padding: `${[Math.floor(Math.random() * 10)]}px`,
          transform: `rotate(${Math.floor(Math.random() * 90) - Math.floor(Math.random() * 90)}deg)`
        })
      }
      this.codeList = codeList
      this.$emit('input', codeList.map(item => item.code).join('')) // 发射输入事件，用于v-model绑定
    },
    getStyle (data) {
      // 生成每个字符的样式字符串
      return `color: ${data.color}; font-size: ${data.fontSize}; padding: ${data.padding}; transform: ${data.transform}`
    }
  }
}
</script>


<style scoped>
.ValidCode{
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer; /* 可点击 */
}
.ValidCode span{
  display: inline-block; /* 每个字符单独排布 */
}
</style>

